#include"curve.h"
//计算残差平方和（Residual Sum of Squares，RSS）
double residualSumOfSquares(DataPoint *data, int num_data, FunctionParams params, int t) {
    if (data == NULL || num_data <= 0) { // 输入验证
        return -1.0; // 输入无效，返回错误值
    }

    double sum_squared_error = 0; // 初始化残差平方和
    int i = 0; // 循环计数器
	
    for (i = -num_data; i < num_data; i++) { // 遍历所有数据点
        double y_pred=0; // 预测的y值
	
        if (t == 1) { // 线性函数: y = ax + b
            y_pred = params.params[1] * data[i].x + params.params[0];
			
        } else if (t == 2) { // 二次函数: y = ax^2 + bx + c
            y_pred = params.params[2] * data[i].x * data[i].x + params.params[1] * data[i].x + params.params[0];
			
        } else if (t == 3) { // 三次函数: y = ax^3 + bx^2 + cx + d
            y_pred = params.params[3] * data[i].x * data[i].x * data[i].x + 
                     params.params[2] * data[i].x * data[i].x + 
                     params.params[1] * data[i].x + params.params[0];
        } else {
            return -1.0; // 无效的函数类型，返回错误值
        }

        double error = data[i].y - y_pred; // 计算误差
        sum_squared_error += error * error; // 累加平方误差
		
    }
	
    return sum_squared_error; // 返回残差平方和
}
//计算决定系数（Coefficient of Determination） 
double calculateRSquared(DataPoint *data, int num_data, FunctionParams params, int t) {
    double rss = residualSumOfSquares(data, num_data, params, t); // 计算残差平方和
    if (rss < 0) { // 检查RSS计算是否成功
        return -1.0; // RSS计算失败，返回错误值
    }

    double tss = 0.0; // 初始化总平方和
    double mean_y = 0.0; // 初始化y值的平均值
    int i; // 循环计数器

    for (i = 0; i < num_data; i++) { // 计算y的平均值
        mean_y += data[i].y;
    }
    mean_y /= num_data; // 计算平均值

    for (i = 0; i < num_data; i++) { // 计算总平方和（TSS）
        double diff = data[i].y - mean_y;
        tss += diff * diff;
    }

    if (tss == 0.0) { // 避免除以零
        return 1.0; // 所有y值相同，视为完美拟合
    }
		
    return 1.0 - (rss / tss); // 计算并返回R平方值: R^2 = 1 - (RSS / TSS)
} 